package com.example.lt.service.user;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.lt.entity.dto.FindPWDTO;
import com.example.lt.entity.dto.RegisterDTO;
import com.example.lt.entity.dto.UpdateUserDTO;
import com.example.lt.entity.queryPage.BasePage;
import com.example.lt.entity.user.User;
import com.example.lt.entity.user.UserModel;
import com.example.lt.entity.video.Type;
import com.example.lt.entity.vo.UserVO;

import java.util.Collection;
import java.util.HashSet;
import java.util.List;

/**
 * @Author 小涛Tao
 * @Date: 2024/07/27/17:03
 * version 1.0 注释：
 **/
public interface UserService extends IService<User> {

    /**
     * 注册用户信息，并创建用户默认收藏夹
     * @param registerDTO
     * @return
     */
    Boolean register(RegisterDTO registerDTO);

    /**
     * 找回密码
     * @param findPWDTO
     * @return
     */
    Boolean findPassword(FindPWDTO findPWDTO);

    /**
     * 根据邮箱 email 查找
     * @param email
     * @return false：该邮箱还未注册  true：该邮箱已被注册
     */
    Boolean getUserByEmail(String email);

    /**
     * 修改用户信息，需要检查 名称、个人描述、头像是否需要审核，还有默认文件夹的修改需要检查文件夹是否存在
     * @param userDTO 用户信息封装类
     */
    void updateUser(UpdateUserDTO userDTO);

    /**
     * 获取用户信息，包括关注和粉丝列表
     * @param userId
     * @return
     */
    UserVO getInfo(Long userId);

    /**
     * 获取关注人列表，包括关注人的基本信息
     * @param basePage
     * @param userId
     * @return
     */
    Page<User> getFollows(BasePage basePage, Long userId);

    /**
     * 获取粉丝列表，包括粉丝的基本信息
     * @param basePage
     * @param userId
     * @return
     */
    Page<User> getFans(BasePage basePage, Long userId);

    /**
     * 订阅或取消订阅分类，并更新 redis 中的模型
     * @param typeIds
     */
    void subscribe(HashSet<Long> typeIds);

    /**
     * 获取用户 userId 订阅的分类
     * @param userId
     * @return
     */
    Collection<Type> listSubscribeType(Long userId);

    /**
     * 获取用户 userId 没有订阅的分类
     * @param userId
     * @return
     */
    Collection<Type> listNoSubscribeType(Long userId);

    /**
     * 批量获取用户基本信息
     * @param userIds 用户ID集合
     * @return
     */
    List<User> list(Collection<Long> userIds);

    /**
     * 关注 或 取关
     * @param followsUserId
     */
    boolean follows(Long followsUserId);

    /**
     * 修改用户模型
     * @param userModel
     */
    void updateUserModel(UserModel userModel);

    /**
     * 添加用户搜索记录
     * @param userId 用户id
     * @param search 搜索关键字
     */
    void addSearchHistory(Long userId, String search);

    /**
     * 获取用户搜索记录
     * @param userId 用户id
     * @return
     */
    Collection<String> searchHistory(Long userId);
}
